package com.example.inventoryapp.util

import android.content.Context
import android.util.Log
import java.io.File
import java.io.FileOutputStream
import java.io.PrintWriter
import java.io.StringWriter
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale

object CrashReporter {
    private const val TAG = "CRASH_REPORTER"

    /**
    * 报告崩溃信息
    * @param context 上下文
    * @param e 异常对象
    * @param location 崩溃位置描述
    */
    fun reportCrash(context: Context, e: Throwable, location: String) {
        try {
            val stackTrace = getStackTrace(e)
            val deviceInfo = getDeviceInfo()
            val time = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(Date())

            val report = """
                |======= CRASH REPORT =======
                |Location: $location
                |Time: $time
                |
                |=== STACK TRACE ===
                |$stackTrace
                |
                |=== DEVICE INFO ===
                |$deviceInfo
                |======= END REPORT =======
                |
            """.trimMargin()

            Log.e(TAG, report)
            saveToFile(context, report)
        } catch (logEx: Exception) {
            Log.e(TAG, "记录崩溃时出错", logEx)
        }
    }

    /**
    * 获取崩溃堆栈信息
    */
    private fun getStackTrace(e: Throwable): String {
        val sw = StringWriter()
        val pw = PrintWriter(sw)
        e.printStackTrace(pw)
        return sw.toString()
    }

    /**
    * 获取设备信息
    */
    private fun getDeviceInfo(): String {
        return """
            |Brand: ${android.os.Build.BRAND}
            |Device: ${android.os.Build.DEVICE}
            |Model: ${android.os.Build.MODEL}
            |Product: ${android.os.Build.PRODUCT}
            |Android SDK: ${android.os.Build.VERSION.SDK_INT}
            |Android Release: ${android.os.Build.VERSION.RELEASE}
        """.trimMargin()
    }

    /**
    * 保存崩溃日志到文件
    */
    private fun saveToFile(context: Context, report: String) {
        try {
            val file = File(context.filesDir, "crashes.log")
            FileOutputStream(file, true).use { fos ->
                fos.write(report.toByteArray())
                fos.write("\n\n".toByteArray()) // 分隔符
            }
        } catch (e: Exception) {
            Log.e(TAG, "保存崩溃日志失败", e)
        }
    }

    /**
    * 读取崩溃日志内容
    */
    fun readCrashReports(context: Context): String {
        return try {
            val file = File(context.filesDir, "crashes.log")
            if (file.exists()) file.readText() else "无崩溃记录"
        } catch (e: Exception) {
            Log.e(TAG, "读取崩溃日志失败", e)
            "读取日志失败: ${e.message}"
        }
    }

    /**
    * 清除崩溃日志
    */
    fun clearCrashReports(context: Context) {
        try {
            val file = File(context.filesDir, "crashes.log")
            if (file.exists()) file.delete()
        } catch (e: Exception) {
            Log.e(TAG, "清除崩溃日志失败", e)
        }
    }
}

/**
 * 在整个项目中使用
 * 在任何需要记录崩溃的地方导入并使用：
 *
 * kotlin
 * 复制
 * import com.example.inventoryapp.util.CrashReporter
 *
 * // 在Activity/Fragment中
 * try {
 *     // 可能出错的代码
 * } catch (e: Exception) {
 *     CrashReporter.reportCrash(requireContext(), e, "MainActivity.onCreate")
 * }
 *
 * // 在ViewModel中
 * class MyViewModel : ViewModel() {
 *     fun performAction() {
 *         try {
 *             // 业务逻辑
 *         } catch (e: Exception) {
 *             // 注意：ViewModel中需要传递Context
 *             // 可以通过Application context
 *             val context = getApplication<Application>().applicationContext
 *             CrashReporter.reportCrash(context, e, "MyViewModel.performAction")
 *         }
 *     }
 * }
 *
 * // 在Composable函数中
 * @Composable
 * fun MyComposable() {
 *     val context = LocalContext.current
 *
 *     Button(onClick = {
 *         try {
 *             // 点击操作
 *         } catch (e: Exception) {
 *             CrashReporter.reportCrash(context, e, "MyComposable.ButtonClick")
 *         }
 *     }) {
 *         Text("点击我")
 *     }
 * }
 * 高级用法：全局异常处理器
 * 在Application类中设置全局异常处理器：
 *
 * kotlin
 * 复制
 * class InventoryApp : Application() {
 *     override fun onCreate() {
 *         super.onCreate()
 *
 *         // 设置全局未捕获异常处理器
 *         Thread.setDefaultUncaughtExceptionHandler { thread, ex ->
 *             // 报告崩溃
 *             CrashReporter.reportCrash(this, ex, "全局未捕获异常")
 *
 *             // 默认处理（可选）
 *             defaultUncaughtExceptionHandler?.uncaughtException(thread, ex)
 *         }
 *     }
 *
 *     // 保存默认的异常处理器
 *     private val defaultUncaughtExceptionHandler =
 *         Thread.getDefaultUncaughtExceptionHandler()
 * }
 * 在AndroidManifest.xml中声明Application类
 * xml
 * 复制
 * <application
 *     android:name=".InventoryApp"
 *     ...>
 * </application>
 */